/*
 * Copyright 1999,2004 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.googlecode.webduff.methods;

import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang.StringUtils;

import com.googlecode.webduff.io.URI;
import com.googlecode.webduff.store.WebdavStore;


public abstract class DeterminableMethod extends AbstractMethod {

    /**
     * Determines the methods normally allowed for the resource.
     *
     * @param exists
     *            does the resource exist?
     * @param isFolder
     *            is the resource a folder?
     * @return all allowed methods, separated by commas
     */
    protected String determineMethodsAllowed(WebdavStore aStore, URI uri) {
    	Set<String> allowedMethods = new HashSet<String>();
    	
    	// always allowed options
    	allowedMethods.add("OPTIONS");
    	
    	try {
	    	if(aStore.objectExists(uri)) {
	    		allowedMethods.add("GET");
	        	allowedMethods.add("HEAD");
	        	allowedMethods.add("POST");
	        	allowedMethods.add("TRACE");
	        	allowedMethods.add("PROPFIND");
	        	
	    		if(aStore.canCreateFolder(uri) || aStore.canCreateResource(uri)) {
	    			allowedMethods.add("PUT");
	    			allowedMethods.add("MKCOL");
	    			allowedMethods.add("DELETE");
	    			allowedMethods.add("COPY");
	    			allowedMethods.add("MOVE");
	    		}
	    	}
    	} catch(Exception e) {
    		
    	}
    	
    	return StringUtils.join(allowedMethods.iterator(), ", ");
    }

}